package youfu

type FunCodeString string

const (
	FunCode_QueryMerIdBalance           FunCodeString = "6003"
	FunCode_BatchTransfer               FunCodeString = "6001"
	FunCode_QueryBatchTranferResult     FunCodeString = "6002"
	FunCode_ProfessionalSign            FunCodeString = "6010"
	FunCode_QueryProfessionalSignResult FunCodeString = "6011"
	FunCode_ProfessionalUnSign          FunCodeString = "6102"
)

const (
	API_VERSION string = "V1.0"
)

// 1、所有接口的请求报文都为此公共请求参数，区别在于不同业务接口，reqData字段的值是不同的
// 2、所有字段类型都为字符串，数字的意思是纯数字的字符串 例如金额100不能是100.00
type ReqMessage struct {
	ReqId   string        `json:"reqId,omitempty"`   //请求序号，每次请求唯一，表明报文的唯一编号
	FunCode FunCodeString `json:"funCode,omitempty"` //接口编码
	MerId   string        `json:"merId,omitempty"`   //商户号，优付分配给客户的唯一编号
	Version string        `json:"version,omitempty"` //接口版本号，目前版本为V1.0(V是大写！)
	ReqData string        `json:"reqData,omitempty"` //对应报文类型所要求的业务数据，详见各个接口参数要求
	Sign    string        `json:"sign,omitempty"`    //业务数据签名
}

// 所有接口的返回报文都为此公共返回参数，区别在于不同业务接口，resData字段的值是不同的
//
/* 示例返回：
{
	"reqId": "ceshi111441",
	"funCode": "6003",
	"merId": "89900000300716159604",
	"version": "V1.0",
	"resData": "{\"accountMap\":{\"30481\":\"174310397\"},\"levyId\":30481,\"resCode\":\"0000\",\"resMsg\":\"成功\"}",
	"resCode": "0000",
	"resMsg": "成功",
	"sign": "Omg3UnpY/Ib7Ui9OicaPiJPskQmIcx1OHY4Um2Fd4Y4+w9gbBFS9AvqRGU+zTkbeyND0SeGo3XEf2lLSsTlp5r0cczYFu8jjE2Mb3zG7mkHN+w52h/CVwLTjNSHPHkynHY15X2LiyntCepcDDBEGY772zXrwZ07EaWVLGLbAFWY="
}
*/
type RespMessage struct {
	ReqId   string        `json:"reqId,omitempty"`   //请求序号，每次请求唯一，表明报文的唯一编号
	FunCode FunCodeString `json:"funCode,omitempty"` //接口编码
	MerId   string        `json:"merId,omitempty"`   //商户号，优付分配给客户的唯一编号
	Version string        `json:"version,omitempty"` //接口版本号，目前版本为V1.0(V是大写！)
	ResData string        `json:"resData,omitempty"` //回执的业务数据
	ResCode string        `json:"resCode,omitempty"` //响应码
	ResMsg  string        `json:"resMsg,omitempty"`  //响应信息
	Sign    string        `json:"sign,omitempty"`    //业务数据签名结果
}

// 商户账户余额查询
// （1）返回的是商户在服务商账户的余额,不是银行卡账户余额
// （2）线下通过银行卡打款成功后，会有15分钟左右的上帐时间，上帐成功后才可查询到更新后的账户余额
type QueryMerIdBalanceReq struct {
	ProviderId uint64 `json:"providerId,omitempty"` //服务商ID
}

// 示例返回：
/*
	{
		"accountMap": {
			"30481": "174310397"
		},
		"levyId": 30481,
		"resCode": "0000",
		"resMsg": "成功"
	}
*/
type QueryMerIdBalanceResp struct {
	Balance    uint64 `json:"balance,omitempty"`    // 返回键值对，”服务商id”:”金额”  例如："30481":"647"，金额单位（分）
	ProviderId uint64 `json:"providerId,omitempty"` //服务商ID
	ResCode    string `json:"resCode,omitempty"`    //响应代码
	ResMsg     string `json:"resMsg,omitempty"`     //响应信息
}

// 商户批量付款
// （1）优付端通过商户批次号+订单号标识唯一订单。
// （2）付款限制：单笔最低10元，单笔最高15万元，每人/月不超过15万元（详询商务）。
// （5）微信付款每人/天限10笔 ，每人单笔限制5千，单日5w限额（详询商务）。
// （6）建议采用同批次多笔订单下发方式，尽量少使用一批次一笔订单方式下发。
// （7）测试环境为了方便测试，付款查询状态下发金额分那一位0为处理中，奇数失败，偶数成功。
type BatchTransferReq struct {
	TaskId     uint64   `json:"taskId,omitempty"`     //付款总金额， 单位：分
	MerBatchId string   `json:"merBatchId,omitempty"` //商户批次号唯一，建议格式yyyyMMddHHmmss+8位随机数
	PayItems   PayItems `json:"payItems,omitempty"`   //付款数据
	ProviderId uint64   `json:"ProviderId,omitempty"` //任务对应编码，作为下发的理由（获取方式：商户平台/项目中心/项目管理/项目管理列表/任务ID）商户可任选一个任务ID，也可根据下发理由匹配
}

type PayItems struct {
	MerOrderId  string `json:"merOrderId,omitempty"` //商户订单号，同批次内确保唯一不可重复
	Amt         uint64 `json:"amt,omitempty"`        //金额（分）纯数字
	PayeeName   string `json:"payeeName,omitempty"`  //收款人名称
	PayeeAcc    string `json:"payeeAcc,omitempty"`   //收款人账号(根据付款方式:银行卡号/支付宝(账号、ID)/微信openid)
	IdCard      string `json:"idCard,omitempty"`     //身份证号
	Mobile      string `json:"mobile,omitempty"`     //收款人手机号 -- 测试的时候需要确认一下这个字段的类型
	PaymentType uint64 `json:"paymentType"`          //付款方式 0：银行卡，1：支付宝，2：微信
	NotifyUrl   uint64 `json:"notifyUrl,omitempty"`  //异步通知地址，商户侧用来接收付款订单的交易结果通知，不填则不会发送异步通知
}

type BatchTransferResp struct {
	SuccessNum    uint64      `json:"successNum,omitempty"`    //该批次订单受理成功笔数
	FailureNum    uint64      `json:"failureNum,omitempty"`    //该批次订单受理失败笔数
	MerBatchId    string      `json:"merBatchId,omitempty"`    //商户批次号
	PayResultList []PayResult `json:"payResultList,omitempty"` //付款返回数据
}

type PayResult struct {
	MerOrderId string `json:"merOrderId,omitempty"` //商户订单号
	OrderNo    string `json:"OrderNo,omitempty"`    //优付侧订单流水号，唯一不重复，供付款查询时使用
	Amt        uint64 `json:"amt,omitempty"`        //付款金额（分）
	Fee        uint64 `json:"fee,omitempty"`        //服务费（分）
	ResCode    string `json:"resCode,omitempty"`    //响应码（订单请求信息的受理状态，非下发订单的交易状态）
	ResMsg     string `json:"resMsg,omitempty"`     //响应信息
}

// 商户批量付款查询
// （1）不填写merOrderId，payItemId 则查询此批次中的全部订单
// （2）如果付款30分钟后付款查询resCode返回6032或6033（该商户批次号不存在，商户订单号或者订单流水号不存在），请确认优付没有落单再重新请求付款，重发一定要保持原商户批次号和商户订单号不变，避免重复支付
type QueryBatchTransferResultReq struct {
	MerId      string      `json:"MerId,omitempty"`      //商户批次号，唯一不可重复
	MerBatchId string      `json:"merBatchId,omitempty"` //商户批次号，唯一不可重复
	QueryItems []QueryItem `json:"queryItems,omitempty"` //查询数据；若为空则返回该批次全部交易结果信息
}

type QueryItem struct {
	MerOrderId string `json:"merOrderId,omitempty"` //商户订单号，同一批次内不可重复
	OrderNo    uint64 `json:"orderNo,omitempty"`    //优付侧订单流水号，唯一不重复，建议付款查询时使用，以确保订单处理的唯一性，防止发生重复处理
	State      uint64 `json:"state,omitempty"`      //交易状态 0：已受理 1：处理中 2：提现中 3：成功 4：失败  说明：以查询最终结果状态为处理依据（3：成功 4：失败 ）
	Amt        uint64 `json:"amt,omitempty"`        //付款金额(分)
	ResCode    string `json:"redCode,omitempty"`    //响应码
	ResMsg     string `json:"resMsg,omitempty"`     //响应信息
	SucAmt     uint64 `json:"sucAmt,omitempty"`     //成功金额
	CreateTime string `json:"createTime,omitempty"` //创建订单时间(格式：yyyy-MM-dd HH:mm:ss)
	EndTime    string `json:"endTime,omitempty"`    //交易完成时间(格式：yyyy-MM-dd HH:mm:ss)
}

type QueryBatchTransferResultResp struct {
	MerId      string      `json:"merId,omitempty"`      //商户号，我司分配给客户的唯一编号
	MerBatchId string      `json:"merBatchId,omitempty"` //商户批次号
	QueryItems []QueryItem `json:"queryItems,omitempty"` //查询数据
}

// 自由职业者签约
// (1)自由职业者签约以商户号+姓名+身份证+服务商做唯一校验(测试环境不会校验姓名和身份证是否匹配,生产环境会校验)
// (2)更换银行卡和手机号不需要重新签约。
// (3)签约方式不需要和付款方式一致。
// (4)签约流程为同步接收签约请求，异步进行签约。
// (5)同步返回结果仅代表优付已成功接收请求。
// (6)签约结果依赖于异步通知，或商户主动通过签约查询接口查询。
type ProfessionalSignReq struct {
	Name        string `json:"name,omitempty"`        //姓名
	CardNo      string `json:"cardNo,omitempty"`       //银行卡号/支付宝账号（手机号或邮箱）/微信openid
	IdCard      string `json:"idCard,omitempty"`      //身份证号码(年龄限制一般为18-65)
	Mobile      string `json:"mobile,omitempty"`      //银行预留手机号 （四要素会校验手机号真实性、其他目前只校验格式（^(1[2,3,4,5,6,7,8,9][0-9])\d{8}$）
	SignType    uint64 `json:"signType,omitempty"`    //签约类型 0：接口签约
	PaymentType uint64 `json:"paymentType"` //签约方式 0：银行卡，1：支付宝，2：微信
	ProviderId  uint64 `json:"providerId,omitempty"`  //服务商id
	IdCardPic1  string `json:"idCardPic1,omitempty"`  //身份证正面（人像），Byte数据转16进制，生成String （图片不要过大<1M）
	IdCardPic2  string `json:"idCardPic2,omitempty"`  //身份证反面（国徽），Byte数据转16进制，生成String（图片不要过大<1M）
	OtherParam  string `json:"otherParam,omitempty"`  //透传参数，在配置回调地址后，系统会将此参数回传给接口调用方;长度限制100
}

type ProfessionalSignResp struct {
	ReqId      string `json:"reqId,omitempty"`      //请求序号，每次请求保持唯一，表明报文的唯一编号
	FunCode    string `json:"funCode,omitempty"`    //接口编码，该接口默认值6010
	MerId      string `json:"merId,omitempty"`      //商户号，我司分配给客户的唯一编号
	Version    string `json:"version,omitempty"`    //接口版本号，目前版本为V1.0
	ResCode    string `json:"resCode,omitempty"`    //响应码
	ResMsg     string `json:"resMsg,omitempty"`     //响应信息
	OtherParam string `json:"otherParam,omitempty"` //透传参数，在配置回调地址后，系统会将此参数回传给接口调用方
}

// 自由职业者签约查询
type QueryProfessionalSignResultReq struct {
	Name       string `json:"name,omitempty"`       //姓名
	CardNo     string `json:"cardNo,omitempty"`     //银行卡号
	IdCard     string `json:"idCard,omitempty"`     //身份证号
	Mobile     uint64 `json:"mobile,omitempty"`     //银行预留手机号
	OtherParam string `json:"otherParam,omitempty"` //需要透传的参数,不填则此字段为空
	ProviderId uint64 `json:"providerId,omitempty"` //服务商Id
}

type QueryProfessionalSignResultResp struct {
	Name       string `json:"name,omitempty"`       //姓名
	CardNo     string `json:"cardNo,omitempty"`     //银行卡号
	IdCard     string `json:"idCard,omitempty"`     //身份证号
	Mobile     string `json:"mobile,omitempty"`     //银行预留手机号
	State      uint64 `json:"state,omitempty"`      //签约状态 0：未签约 1：已签约 2:未检索到自由职业者信息 3：签约中，4签约失败
	SignType   uint64 `json:"signType,omitempty"`   //签约类型 0：接口签约 1：公众号签约
	OtherParam string `json:"otherParam,omitempty"` //需要透传的参数,不填则此字段为空
	LevyId     uint64 `json:"levyId,omitempty"`     //服务商ID
	RetMsg     string `json:"retMsg,omitempty"`     //失败原因
}

//自由职业者解约
// 1.更换手机号和银行卡后，解约参数不要上传手机号和银行卡。
// 2.如该自由职业者是签约失败状态，则解约也失败，返回描述：该自由职业者无签约记录
type ProfessionalUnSignReq struct {
	LevyId uint64 `json:"levyId,omitempty"` //服务商Id
	Name   string `json:"name,omitempty"`   //姓名
	IdCard string `json:"idCard,omitempty"` //身份证号
}

type ProfessionalUnSignResp struct {
	State  uint64 `json:"state,omitempty"`  //解约结果; 1:解约失败 0: 解约成功
	RetMsg string `json:"retMsg,omitempty"` //失败原因
}
